// class Solution {
// public:
//     unordered_map<char, int> mp;
//     struct Compare {
//         unordered_map<char, int>& mp;
//         Compare(unordered_map<char, int>& _mp) : mp(_mp) {}
//         bool operator()(const string& left, const string& right) const {
//             int a = 0;
//             for (auto& e : left) {
//                 a += mp[e];
//             }
//             int b = 0;
//             for (auto& e : right) {
//                 b += mp[e];
//             }
//             if (a == b) {
//                 return left.size() < right.size();
//             } else {
//                 return a < b;
//             }
//         }
//     };
//     int lengthstr(const string& str) {
//         int a = 0;
//         for (auto& e : str) {
//             a += mp[e];
//         }
//         return a;
//     }
//     bool equal(string left,string right){
//         if(left.size()!=right.size()||lengthstr(left)!=lengthstr(right)){
//             return false;
//         }
//         sort(left.begin(),left.end());
//         sort(right.begin(),right.end());
//         for(int i=0;i<left.size();i++){
//             if(left[i]!=right[i]){
//                 return false;
//             }
//         }
//         return true;
//     }
//     vector<vector<string>> groupAnagrams(vector<string>& strs) {
//         if(strs.size()==0){
//             vector<string> pp;
//             pp.push_back("");
//             vector<vector<string>> yy;
//             yy.push_back(pp);
//             return yy;
//         }
//         for (int i = 0; i < 26; i++) {
//             mp['a' + i] = pow(2, i);
//         }
//         vector<vector<string>> result;
//         sort(strs.begin(), strs.end(), Compare(mp));
//         vector<string> pos;
//         for (int i = 0; i < strs.size(); i++) {
//             if (!i) {
//                 pos.push_back(strs[i]);
//             } else {
//                 if (equal(strs[i],strs[i-1])) {
//                     pos.push_back(strs[i]);
//                 } else {
//                     result.push_back(pos);
//                     pos.clear();
//                     pos.push_back(strs[i]);
//                 }
//             }
//         }
//         if(pos.size()){
//             result.push_back(pos);
//         }
//         return result;
//     }
// };


class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        unordered_map<string, vector<string>> mp;
        for (string& str: strs) {
            string key = str;
            sort(key.begin(), key.end());
            mp[key].emplace_back(str);
        }
        vector<vector<string>> ans;
        for (auto it = mp.begin(); it != mp.end(); ++it) {
            ans.emplace_back(it->second);
        }
        return ans;
    }
};